package co.com.coomeva.adminEvaluacion.logica;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;

//import co.com.coomeva.adminEvaluacion.modelo.entidades.EdPAccion;
import co.com.coomeva.adminEvaluacion.modelo.entidades.EdPUnidadNegocio;
import co.com.coomeva.adminEvaluacion.modelo.entidades.EdUsuario;
import co.com.coomeva.adminEvaluacion.modelo.entidades.EdUsuarioId;
import co.com.coomeva.adminEvaluacion.modelo.entidades.consulta.Consulta;
import co.com.coomeva.adminEvaluacion.modelo.persistencia.EdPUnidadNegocioDAO;
import co.com.coomeva.adminEvaluacion.modelo.util.DatabaseUtil;


/**
 * A data access object (DAO) providing persistence and search support for
 * EdPUnidadNegocio entities. Transaction control of the save(), update() and
 * delete() operations can directly support Spring container-managed
 * transactions or they can be augmented to handle user-managed Spring
 * transactions. Each of these methods provides additional information for how
 * to configure it for the desired type of transaction control.
 * 
 * @see co.com.coomeva.adminEvaluacion.modelo.entidades.EdPUnidadNegocio
 * @author MyEclipse Persistence Tools
 */

public class EdPUnidadNegocioLogica {
	private static EdPUnidadNegocioLogica logica = null;
	
	//Objeto con el que se accede a la BD
	private EdPUnidadNegocioDAO unidadNegocioDAO = null;
	
	public EdPUnidadNegocioLogica() {
		unidadNegocioDAO = new EdPUnidadNegocioDAO();
	}
	
	public static EdPUnidadNegocioLogica getInstance()	{
		if(logica == null) {
			logica = new EdPUnidadNegocioLogica();
		}
		return logica;
	}

	@SuppressWarnings("unchecked")
	public List<EdPUnidadNegocio> consultarUnidadNegocioPorGerencia(Long gerenciaCodigo) throws Exception {
		Session session = unidadNegocioDAO.getSession();
		List<EdPUnidadNegocio> valorList = new ArrayList<EdPUnidadNegocio>();
		
		try {
			Criteria criterios = session.createCriteria(EdPUnidadNegocio.class);
			//if (gerenciaCodigo != null && gerenciaCodigo.longValue() > 0) {
				/*************FILTRA LAS UNIDADES DE NEGOCIO POR GERENCIA***********/
				criterios.add(Expression.eq("gerenciaCodigo", gerenciaCodigo));
				/*************FILTRA LAS UNIDADES DE NEGOCIO POR GERENCIA***********/
			//}
			
			//Estado activo...
			criterios.add(Expression.eq("estado", new Long("1")));
			
			criterios.addOrder(Order.asc("nombre"));
			valorList = criterios.list();
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error consultando los registros");
		} finally {
			unidadNegocioDAO.getSession().clear();
			unidadNegocioDAO.getSession().close();
		}
		return valorList;
	}

	public String obtenerNombre(Long consUnidadNegocio) throws Exception {
		String strNombre = null;
		Session session = unidadNegocioDAO.getSession();
		List<EdPUnidadNegocio> valorList = new ArrayList<EdPUnidadNegocio>();
		
		try {
			Criteria criterios = session.createCriteria(EdPUnidadNegocio.class);
			if (consUnidadNegocio != null && consUnidadNegocio.longValue() > 0) {
				//Estado activo...
				criterios.add(Expression.eq("consUnidadNegocio", consUnidadNegocio));
				valorList = criterios.list();
				
				if (valorList != null && valorList.size() > 0) {
					EdPUnidadNegocio objTMP = valorList.get(0);
					strNombre = objTMP.getNombre();
				} else {
					throw new Exception("Error obteniendo Nombre de Unidad de negocio");
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error obteniendo Nombre de Unidad de negocio");
		} finally {
			unidadNegocioDAO.getSession().clear();
			unidadNegocioDAO.getSession().close();
		}
		return strNombre;
	}

	public List<Consulta> consultarDeptoPorGerencia(Long gerenciaCodigo, Long empDepto) throws Exception {
		List<Object[]> lResult;
		Consulta objTMP;
		try {
			List<Consulta> valorList = new ArrayList<Consulta>();
			
			Query qSelect = unidadNegocioDAO.getSession().getNamedQuery("deptos_x_gerencia");
			String strSelect = qSelect.getQueryString();
			
			if (gerenciaCodigo != null && gerenciaCodigo.longValue() > 0) {
				if (strSelect.contains("WHERE")) {
					strSelect = strSelect + " AND emp_gerencia = '"+gerenciaCodigo+"'";
				} else {
					strSelect = strSelect + " WHERE emp_gerencia = '"+gerenciaCodigo+"'";
				}
			}
			
			if (empDepto != null && empDepto.longValue() > 0) {
				if (strSelect.contains("WHERE")) {
					strSelect = strSelect + " AND emp_depto = '"+empDepto+"'";
				} else {
					strSelect = strSelect + " WHERE emp_depto = '"+empDepto+"'";
				}
			}
			
			strSelect = strSelect + " order by lower(depto_nombre)";
			
			//System.out.println("Query deptos: " + strSelect);
			
			//qSelect.setLong("empGerencia", gerenciaCodigo);
			
			//lResult = qSelect.list();
			
			lResult = DatabaseUtil.ejecutarConsulta(unidadNegocioDAO.getSession(), strSelect);
			
			for (Iterator<Object[]> iter = lResult.iterator(); iter.hasNext();) {
				Object[] obj = (Object[]) iter.next();
				//Consulta objTMP = new Consulta();
				//System.out.print("--> " + obj[0] + "\t\t" + obj[1]);
				
				objTMP = new Consulta();
				
				if (obj[0] != null) objTMP.setEmpDepto(new Long(obj[0].toString()));
				if (obj[1] != null) objTMP.setDeptoNombre(obj[1].toString());
				
				valorList.add(objTMP);
			}
			
			return valorList;
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error consultando los registros -> " + e.getMessage());
		} finally {
			lResult = null;
			objTMP = null;
			unidadNegocioDAO.getSession().clear();
			unidadNegocioDAO.getSession().close();
		}
	}

	public List<Consulta> consultarRegionales(Long departamento) throws Exception {
		List<Object[]> lResult;
		Consulta objTMP;
		try {
			List<Consulta> valorList = new ArrayList<Consulta>();
			
			Query qSelect = unidadNegocioDAO.getSession().getNamedQuery("regionales_x_depto");
			qSelect.setLong("empDepto", departamento);
			
			lResult = qSelect.list();
			
			for (Iterator<Object[]> iter = lResult.iterator(); iter.hasNext();) {
				Object[] obj = (Object[]) iter.next();
				//Consulta objTMP = new Consulta();
				//System.out.print("--> " + obj[0] + "\t\t" + obj[1]);
				
				objTMP = new Consulta();
				
				if (obj[0] != null) objTMP.setEmpLocalidad(new Long(obj[0].toString()));
				if (obj[1] != null) objTMP.setLocalidadNombre(obj[1].toString());
				
				valorList.add(objTMP);
			}
			
			return valorList;
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error consultando las regionales -> " + e.getMessage());
		} finally {
			lResult = null;
			objTMP = null;
			unidadNegocioDAO.getSession().clear();
			unidadNegocioDAO.getSession().close();
		}
	}

	public List<Consulta> consultarAreas(Long gerenciaCodigo, Long departamento) throws Exception {
		List<Object[]> lResult;
		Consulta objTMP;
		try {
			List<Consulta> valorList = new ArrayList<Consulta>();
			
			Query qSelect = unidadNegocioDAO.getSession().getNamedQuery("areas_x_depto_x_gerencia");
			qSelect.setLong("empGerencia", gerenciaCodigo);
			qSelect.setLong("empDepto", departamento);
			
			lResult = qSelect.list();
			
			for (Iterator<Object[]> iter = lResult.iterator(); iter.hasNext();) {
				Object[] obj = (Object[]) iter.next();
				//Consulta objTMP = new Consulta();
				//System.out.print("--> " + obj[0] + "\t\t" + obj[1]);
				
				objTMP = new Consulta();
				
				if (obj[0] != null) objTMP.setEmpArea(new Long(obj[0].toString()));
				if (obj[1] != null) objTMP.setAreaNombre(obj[1].toString());
				
				valorList.add(objTMP);
			}
			
			return valorList;
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error consultando las areas -> " + e.getMessage());
		} finally {
			lResult = null;
			objTMP = null;
			unidadNegocioDAO.getSession().clear();
			unidadNegocioDAO.getSession().close();
		}
	}

	public List<Consulta> consultarEmpresas() throws Exception {
		List<Object[]> lResult;
		Consulta objTMP;
		try {
			List<Consulta> valorList = new ArrayList<Consulta>();
			
			Query qSelect = unidadNegocioDAO.getSession().getNamedQuery("consulta_gerencias");
			
			lResult = qSelect.list();
			
			for (Iterator<Object[]> iter = lResult.iterator(); iter.hasNext();) {
				Object[] obj = (Object[]) iter.next();
				//Consulta objTMP = new Consulta();
				//System.out.print("--> " + obj[0] + "\t\t" + obj[1]);
				
				objTMP = new Consulta();
				
				if (obj[0] != null) objTMP.setGerenciaCodigo((new Long(obj[0].toString())));
				if (obj[1] != null) objTMP.setNombre(obj[1].toString());
				
				valorList.add(objTMP);
			}
			
			return valorList;
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error consultando las empresas -> " + e.getMessage());
		} finally {
			lResult = null;
			objTMP = null;
			unidadNegocioDAO.getSession().clear();
			unidadNegocioDAO.getSession().close();
		}
	}

	public EdPUnidadNegocio consultarPorId(Long consUnidadNegocio) throws Exception {
		EdPUnidadNegocio unidadNegocio = null;
		try {
			unidadNegocio = unidadNegocioDAO.findById(consUnidadNegocio);
		} catch (Exception e) {
			throw new Exception("Error consultando la unidad de negocio -> "+e.getMessage());
		} finally {
			unidadNegocioDAO.getSession().clear();
			unidadNegocioDAO.getSession().close();
		}
		return unidadNegocio;
	}
}